/*
 * 约定：
 * 子页面中不要定义全局变量
 * 变量定义在page中
 */

var app = {
	pageInitOptions:null,
    defaultOptions:{
	    menuDefaultClass:'fa',// 菜单栏默认的图标样式
		mianMenuUrl:"main.html",// 主页菜单url
		mianMenuTitle:"主页",// 主页菜单title
		menuOpenPageTime:300,//从菜单打开页面的动画时间
        enableMessagesFunction:false,// 开启消息功能
        enableNotificationsFunction:false,// 开启通知功能
        enableTasksFunction:false,// 开启任务功能
		menuUrl:"data/menu.json"// 开启任务功能
    },
	templates:{}// 模板
};
var page = {};// 页面变量


$(function(){
	app.$tyAllContent = $("#tyAllContent");
	app.$tyContent = $("#tyContent");
	app.$tySmallTitle = $("#tySmallTitle");
	app.$tyTitle = $("#tyTitle");
	app.$tyContentHeader = $("#tyContentHeader");
	app.$tyMenu = $("#tyMenu");
    app.$tyBreadcrumb = $("#tyBreadcrumb");

    // 菜单绑定事件
    //app.menuEveny();
    app.tree('.sidebar');
	// 加载菜单
	app.parseMenu(app.defaultOptions.menuUrl, "tsParentId", "tsId", "tsSonObj", app.defaultOptions.menuDefaultClass);

	// 加载模板
	$.get("templates/CRUDList.html",null,function(t){
		app.templates.CRUDList = doT.template(t);
	});

	// 初始化插件
	app.initPlugin();

	// 加载首页
	app.open(app.defaultOptions.mianMenuUrl);
});

// 初始化各种插件
app.initPlugin = function () {


	// toastr通知
	toastr.options = {
		"closeButton": false,
		"debug": false,
		"newestOnTop": false,
		"progressBar": true,
		"positionClass": "toast-bottom-right",
		"preventDuplicates": false,
		"onclick": null,
		"showDuration": "300",
		"hideDuration": "1000",
		"timeOut": "5000",
		"extendedTimeOut": "1000",
		"showEasing": "swing",
		"hideEasing": "linear",
		"showMethod": "fadeIn",
		"hideMethod": "fadeOut"
	};

	// select2下拉框
	$.fn.select2.defaults.set("language", "zh-CN");
	$.fn.select2.defaults.set("minimumResultsForSearch", Infinity);


	// bootstrapTable表格
	$.extend(jQuery.fn.bootstrapTable.defaults, {
		striped: true// 隔行变色
		,sidePagination: 'server'// 在服务端分页
		,pagination: true// 分页条
	} );


};


//=================================================
// 自定义缓存数据
//=================================================
app.cahce = {};
app.setCache = function (key, value) {
	app.setCache("default",key,value);
};
app.setCache = function (type, key, value) {
	app.cahce[type][key] = value;
};
app.getCache = function (key) {
	app.getCache("default",key);
};
app.getCache = function (type, key) {
	return app.cahce[type][key];
};
//=================================================


app.msg = function(msg,title, type){
	if (!type) type = "info";
	toastr[type](msg, title);
};
app.infoMsg = function(msg,title){
	app.msg(msg,title,"info");
};
app.errorMsg = function(msg,title){
	app.msg(msg,title,"error");
};
app.successMsg = function(msg,title){
	app.msg(msg,title,"success");
};
app.warningMsg = function(msg,title){
	app.msg(msg,title,"warning");
};
app.confirm = function(msg,callback) {
	layer.confirm(msg, {icon: 3, title:'提示'}, function(index){
			try{
				if (callback && callback instanceof Function)
					callback();
			}catch (e){}
		layer.close(index);
	});
};
app.dialog = function(content,callback, title, weight) {
	layer.open({
		type: 1,
		title: title,
		shadeClose: true,
		btn: ['确定', '取消'],
		btn1: function(i) {
			try{
				if (callback && callback instanceof Function)
					callback();
			}catch (e){}
			layer.close(i);
		},
		area: weight,
		content: content
	});
};

app.pageInit = function(o) {
	app.pageInitOptions = o;
};

app.open = function(u,$this,type) {


	// 置空前一个子页面变量
	page = {};
	// 隐藏子页面区域
	app.$tyAllContent.hide();

	// 判断菜单类型，远程加载、本地加载、模板加载
	if (type === "template") {
		// 加载配置
		$.get(u,null,function(r){
			app.$tyContent.empty();
			console.log(app.templates.CRUDList(r));
			app.$tyContent.html(app.templates.CRUDList(r));
			app.$tyContent.html(app.templates.CRUDList(r));

			$("[data-ty-pageinit]").each(function(){
				var $_this = $(this);
				$_this[$_this.attr("data-ty-pageinit")](app.pageInitOptions[$_this.attr("data-ty-pageinitdate")]);
			});

			app.pageInitOptions = null;
			app.$tyAllContent.fadeIn(app.defaultOptions.menuOpenPageTime);
		},"json");

		// 使用模板加载
		app.openEnd(u,$this);
		return;
	}

	// 加载子页面
	app.$tyContent.load(u,null,function(r,s){
	    // 页面加载失败则打开404页面
		if (s !== "success") {
			app.$tyContent.load("404.html", null, function(rr,ss){
			    // 404也加载失败了。。。。。
				if (ss !== "success")
					app.$tyContent.empty();
			});
			return;
		}

		app.openEnd(u,$this);

	});

};

// 加载页面完毕执行
app.openEnd = function(u,$this) {
	// 默认空值
	if (!app.pageInitOptions) app.pageInitOptions = {};

	// 标题
	if (app.pageInitOptions.showTitle || app.pageInitOptions.showTitle == null) {
		if (app.pageInitOptions.title) {
			app.$tyTitle.text(app.pageInitOptions.title);
			app.$tyContentHeader.show();
		} else if ($this) {
			app.$tyTitle.text($this.text());
			app.$tyContentHeader.show();
		} else
			app.$tyContentHeader.hide();
	} else
		app.$tyContentHeader.hide();

	// 副标题
	if (app.pageInitOptions.showSmallTitle || app.pageInitOptions.showSmallTitle == null) {
		if (app.pageInitOptions.smallTitle) {
			app.$tySmallTitle.text(app.pageInitOptions.smallTitle);
			app.$tySmallTitle.show();
		} else
			app.$tySmallTitle.hide();
	} else
		app.$tySmallTitle.hide();

	// 面包屑菜单
	if (u === app.defaultOptions.mianMenuUrl)
		app.parseMenuList(null);
	else
		app.parseMenuList($this);


	if (!app.pageInitOptions.smallTitle) app.pageInitOptions.smallTitle = "";


	// 回调
	try {
		if (app.pageInitOptions.callback && app.pageInitOptions.callback instanceof Function)
			app.pageInitOptions.callback();
		else {
			// 默认回调
			$("[data-ty-pageinit]").each(function(){
				var $_this = $(this);
				$_this[$_this.attr("data-ty-pageinit")](app.pageInitOptions[$_this.attr("data-ty-pageinitdate")]);
			});
		}
	}catch (e) {}




	// 置空子页面初始化参数
	app.pageInitOptions = null;
	// 显示子页面区域
	app.$tyAllContent.fadeIn(app.defaultOptions.menuOpenPageTime);


};


app.parseMenuList = function($this) {
    app.$tyBreadcrumb.empty();
    if ($this)
        app.$tyBreadcrumb.show();
    else {
        app.$tyBreadcrumb.hide();
        return;
    }


    // 获取菜单
    var str = "";
    $this.parents('li').find(" > a > span:first").each(function(i){
        var $_this = $(this);
        var css = $_this.prev("i").attr("class");
        str += '<li class="active">';
        if (css !== app.defaultOptions.menuDefaultClass)
            str += '<i class="' + $_this.prev("i").attr("class") + '"></i> ';
        str += $(this).text() + '</li>';
    });
	app.$tyBreadcrumb.append('<li><a onclick="app.open(\'' + app.defaultOptions.mianMenuUrl + '\')"><i class="fa fa-home"></i> ' + app.defaultOptions.mianMenuTitle + '</a></li>' + str);
};

// 添加消息到消息面板
app.addMsg = function () {

};


// 解析菜单
app.parseMenu = function(url,p_fN,p_idN,p_sN,p_nullIconClass) {
	$.get(url,null,function(t){
		var menus = app.parseParentDate(t,p_fN,p_idN,p_sN);
		app.$tyMenu.empty();
		if (!p_nullIconClass) p_nullIconClass = app.defaultOptions.menuDefaultClass;

		function addOneMenu(ds) {
			if (!ds || ds.length == 0) return "";
			var str = "";
			var f = false;
			var d;
			for (var i = 0; i < ds.length; ++i) {
				d = ds[i];
				if (d[p_sN] && d[p_sN].length != 0)
					f = true;
				else
					f = false;

				str += '<li';
				if (f)
					str += ' class="treeview"';
				str += '><a';
				if (!f && d.pageType)
					str += ' data-pageType="' + d.pageType + '"';
				if (!f && d.tsUrl)
					str += ' data-url="' + d.tsUrl + '"';
				str += '>';
				if (d.tsIconClass)
					str += '<i class="' + d.tsIconClass +'"></i>';
				else if (p_nullIconClass)
					str += '<i class="' + p_nullIconClass +'"></i>';
				str += ' <span>';
				if (d.tsTitle)
					str += d.tsTitle;
				str += '</span>';
				if (f)
					str += '<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>';
				str += '</a>';
				if (f) {
					str += '<ul class="treeview-menu">';
					str += addOneMenu(d[p_sN]);
					str += '</ul>';
				}

			}
			return str;
		}
		app.$tyMenu.append('<li class="active"><a href="javascript:void(0)" data-url="' + app.defaultOptions.mianMenuUrl + '"><i class="fa fa-home"></i> <span>'+ app.defaultOptions.mianMenuTitle + '</span></a></li>' + addOneMenu(menus));
		$.AdminLTE.layout.fix();
	},"json");

};


/*
 * 将包含父id的记录，解析为子放在父对象下
 * 示例源对象：[{id:"1",name:"父对象"},{id:"2",name:"子对象",parentId:"1"}]
 * 示例返回对象：[{id:"1",name:"父对象",sonObj:[{id:"2",name:"子对象"}]}]
 *
 * p_data：包含父子关系的数据，示例源对象
 * p_fN(fatherIdAttributeName)：源对象中表示父对象id的属性名，示例源对象中的parentId
 * p_idN(idAttributeName)：表示id的属性名，示例源对象中的id
 * p_sN(toSonAttributeName)：解析出来的对象表示子对象的属性名，示例返回对象中的sonObj
 */
app.parseParentDate = function(p_data,p_fN,p_idN,p_sN) {
	// 参数检查
	if (!p_data || !(p_data instanceof Array)) return [];
	if (!p_fN) p_fN = "parentId";
	if (!p_idN) p_idN = "id";
	if (!p_sN) p_sN = "sonObj";

	// 变量定义
	var result = [];// 返回的对象
	var objs = {};// 用于记录所以对象，key=id,value=object
	var tempz;//子临时变量
	var tempf;//父临时变量

	// 将objs准备好
	for (var i = 0; i < p_data.length; ++i) {
		tempz = p_data[i];
		// 如果p_idN为空则跳过
		if (!tempz[p_idN])
			continue;

		// 放入所有对象中，此时应该是绝对不存在这个对象的
		// 属性名为id，便于根据id查找，值为那个对象
		objs[tempz[p_idN]] = tempz;

		// 将无p_fN的放入retult并给一个p_sN属性
		if (!tempz[p_fN]) {
			delete tempz[p_fN];// 连为null的也删掉
			result.push(tempz);
		}

	}

	// 清空源数据
	p_data.splice(0,p_data.length);

	// 此时objs存放着所有的对象，下一步将子对象放到父对象中

	// 遍历objs
	for (var id in objs) {
		tempz = objs[id];
		// 如果p_fN为空则跳过
		if (!tempz[p_fN])
			continue;

		// 从objs中找到父对象，并加到其p_sN属性中，p_sN属性不存在则创建一个数组
		tempf = objs[tempz[p_fN]];

		// 父对象不存在则跳过
		if (!tempf)
			continue;

		// 根据父对象有无p_sN属性做出不同赋值操作
		if (tempf[p_sN]) {
			// 存在p_sN属性
			tempf[p_sN].push(tempz);
		} else {
			// 不存在p_sN属性
			tempf[p_sN] = [tempz];
		}

		// 删除子对象的p_fN属性
		delete tempz[p_fN];
	}

	return result;
};


//=========================
var test = {};
test.msg = [
    {
        tsId:"1",
        tsTitile:"(｡･∀･)ﾉﾞ嗨",
        tsContent:"你好",
        tsPhoto:null,
        tsSendTime:"2016-05-36 12:45:12"
    },{
        tsId:"2",
        tsTitile:"(｡･∀･)ﾉﾞ嗨",
        tsContent:"你好",
        tsPhoto:null,
        tsSendTime:"2016-05-36 12:45:12"
    },{
        tsId:"3",
        tsTitile:"(｡･∀･)ﾉﾞ嗨",
        tsContent:"你好",
        tsPhoto:null,
        tsSendTime:"2016-05-36 12:45:12"
    }


];



app.tree = function (menu) {
	var animationSpeed = $.AdminLTE.options.animationSpeed;
	$(document).off('click', menu + ' li a')
		.on('click', menu + ' li a', function (e) {
			// 得到点击的链接和下一个元素
			var $this = $(this);

			var checkElement = $this.next();

			// 检查下一个元素是菜单是否可见
			if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) {
				// 关闭菜单
				checkElement.slideUp(animationSpeed, function () {
					checkElement.removeClass('menu-open');
					// 固定布局的情况下，侧边栏延伸窗口的高度
					$.AdminLTE.layout.fix();
				});
				checkElement.parent("li").removeClass("active");
			}
			// 如果菜单不可见
			else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
				// 获取父菜单
				var parent = $this.parents('ul').first();
				// 关闭父内所有打开的菜单
				var ul = parent.find('ul:visible').slideUp(animationSpeed);
				// 从父菜单中删除菜单打开样式
				ul.removeClass('menu-open');
				// 得到父li
				var parent_li = $this.parent("li");
				// 打开目标菜单并添加菜单打开样式

				checkElement.slideDown(animationSpeed, function () {
					// 向父li添加样式
					checkElement.addClass('menu-open');
					parent.find('li.active').removeClass('active');
					parent_li.addClass('active');
					// 固定布局的情况下，侧边栏延伸窗口的高度
					$.AdminLTE.layout.fix();
				});
			}
			else {

				// 获取父菜单
				var parent = $this.parents('ul').first();
				// 关闭父内所有打开的菜单
				var ul = parent.find('ul:visible').slideUp(animationSpeed);
				var parent_li = $this.parent("li");
				parent.find('li.active').removeClass('active');
				parent_li.addClass('active');
                // 操作
                var url = $this.attr("data-url");
                if (url) {
                    app.open(url,$this,$this.attr("data-pageType"));
                }
			}

			// 如果这不是一个链接，防止页面被重定向
			if (checkElement.is('.treeview-menu')) {
				e.preventDefault();
			}
		});
};